#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolTip>


const int constSec = 1000;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    d_isi = new Isi(0,this);
//    d_db = QSqlDatabase();
//    d_db = QSqlDatabase::addDatabase("QSQLITE");
    d_socket = new QTcpSocket(this);            // создаем сокет клиента
    connect(d_socket,&QTcpSocket::readyRead,this,&MainWindow::slotReadyRead);   // сокет клиента готов читать
    connect(d_socket,&QTcpSocket::disconnected,this,&MainWindow::deleteLater);  // отключаем клиента и удаляем сокет
    connect(d_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotError(QAbstractSocket::SocketError)));
    d_nextBlockSize = 0;                        // обнуляем размер следующего блока
    QProcess *process = new QProcess();
    process->start(QString("./viewsignal"));
//    process->start(QString(""))
}

MainWindow::~MainWindow()
{
    delete ui;
    delete d_isi;
}

void MainWindow::on_pushButton_clicked()
{
    d_socket->connectToHost(ui->lineEdit->text(),2323); // подключаться к ip: 172.122.1.24
//    ui->lineEdit->clear();
}

void MainWindow::sendToServer(bool status)          // отправить данные на сервер
{
    data.clear();                                       // очистка данных
    QDataStream out(&data, QIODevice::WriteOnly);       // создали поток данных для записи
    out.setVersion(QDataStream::Qt_5_14);                 // назначили версию для потока
    out << status;                                        // записали в поток условие о полном или не полном получении сообщения
    d_socket->write(data);                              // записать данные в сокет
}

void MainWindow::slotReadyRead()
{
    bool ok = false;
    QDataStream in(d_socket);
    in.setVersion(QDataStream::Qt_5_14);
    if(in.status() == QDataStream::Ok)
    {
        for(;;)
        {
            if(d_nextBlockSize == 0)
            {
                if(d_socket->bytesAvailable() < 2)
                {
                    break;
                }
                in >> d_nextBlockSize;
            }
            if(d_socket->bytesAvailable() < d_nextBlockSize)
            {
                qDebug()<< "Error: data not full";
                break;
            }
            QString str = "";
            in >> str;
            qDebug()<<"Получил строку:"<<str;
            int pos = str.indexOf(":");
            QString type = str.mid(0, pos);
            QString message = str.mid(pos+1);
            if(type.contains("file",Qt::CaseInsensitive))
            {
                ok = parseMessageTypeFile(message);
                d_nextBlockSize = 0;
            }
            else {
                if(type.contains("header",Qt::CaseInsensitive))
                {
                    ok = parseMessageTypeHeader(message);
                    d_nextBlockSize = 0;
                }
                else
                {
                    if(type.contains("data",Qt::CaseInsensitive))
                    {
                        ok = parseMessageTypeData(message);
                        d_nextBlockSize = 0;
                    }
                    else
                    {
                        qDebug() << "Error! Unknown type";
                        ok = false;
                    }
                }
            }
        }
    }
    else
    {
        ui->textBrowser->append("read error");
    }
    sendToServer(ok);
    return;
}
void MainWindow::delay(int n)                     // задержка для эксперимента Сервер-Клиент с задержкой
{
    QEventLoop loop;
    QTimer::singleShot(n,&loop,SLOT(quit()));
    loop.exec();
}

void MainWindow::slotError(QAbstractSocket::SocketError err)
{
    QString strError = "Error: " + (err == QAbstractSocket::HostNotFoundError ?
                                        "The host was not found." :
                                        err == QAbstractSocket::RemoteHostClosedError?
                                            "The remote host is closed." :
                                            err == QAbstractSocket::ConnectionRefusedError?
                                                "The connection was refused." :
                                                QString(d_socket->errorString())) ;
    qDebug()<< "Сработал slotError! ERROR: " <<strError;
}

void MainWindow::on_lineEdit_returnPressed()
{
    d_socket ->connectToHost(ui->lineEdit->text(),2323);
//    ui->lineEdit->clear();
}

bool MainWindow::parseMessageTypeFile(const QString &message)
{
    if(message.isEmpty())
    {
        qDebug()<<"messageTypeFile empty";
        return false;
    }
    int poss = message.indexOf(" ");

    QString name = message.mid(0,poss);
    d_rowCount = message.mid(poss+1).toInt();

    QDir qdir;
    qdir.mkdir("./../receiver");
    qdir.cd("./../receiver");
    QFile file(QString("%1/%2").arg(qdir.absolutePath()).arg(name));
    if(file.exists())
    {
        file.remove();
    }
    d_isi->setPath(QString("%1/%2").arg(qdir.absolutePath()).arg(name));
    ui->textBrowser->append(name);
    if(!d_isi->open())
    {
        qDebug() << "d_isi not Open";
        return false;
    }
    d_isi->createTable();
    return true;
}

bool MainWindow::parseMessageTypeHeader(const QString &message)
{
    if(message.isEmpty())
    {
        qDebug()<< "messageTypeHeader empty";
        return false;
    }
    bool ok = false;
    QStringList list;
    QRegExp reg("(\\d+)");
    int pos = 0;
    while((pos = reg.indexIn(message,pos)) != -1) {
        list <<  reg.cap(1);
        pos += reg.matchedLength();
    }
    if (d_isi->open())
    {
        ok = d_isi->insertHeader(list);
        list.clear();
    }
    return ok;
}

bool MainWindow::parseMessageTypeData(const QString &message)
{
    if(message.isEmpty())
    {
        qDebug()<< "messageTypeData empty";
        return true;
    }
    if (d_rowCount == d_writeRowCount)
    {
        qDebug()<<"Получены все записи. Отключение от сервера.";
        d_socket->disconnectFromHost();
        return true;
    }
    else
    {
        bool ok = false;
        QStringList list;
        QRegExp reg("(\\d+)");
        int pos = 0;
        while ((pos = reg.indexIn(message, pos)) != -1) {
            list << reg.cap(1);
            pos += reg.matchedLength();
        }
        if(d_isi->open())
        {
            d_isi->insertData(list);
            d_writeRowCount++;
            d_nextBlockSize = 0;
            ui->textBrowser->append(message);
            list.clear();
            ok = true;
        }
        return ok;
    }
}

